﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using FisApp.utility;
using FisApp.session;
using FisApp.enums;
using System.Diagnostics;
using Microsoft.Win32;

namespace FisApp
{
    public partial class FrmLogin : Form
    {
        public bool LogonSuccessful;

        public string kullaniciAdı
        {
            get
            {
                return txtKullaniciAdi.Text;
            }
            set
            {
                txtKullaniciAdi.Text = value;
            }
        }

        public string sifre
        {
            get
            {
                return txtSifre.Text;
            }
            set
            {
                txtSifre.Text = value;
            }
        }

        public FrmLogin()
        {
            InitializeComponent();
        }

        private void btnOnay_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(kullaniciAdı))
                {
                    FrmMessage.showDialog("Kullanıcı adı giriniz.", MessageTypes.Warning);
                    return;
                }
                if (string.IsNullOrEmpty(sifre))
                {
                    FrmMessage.showDialog("Şifre giriniz.", MessageTypes.Warning);
                    return;
                }

                string query = "SELECT * FROM users WHERE user_name=@user_name AND user_password=@user_password";

                List<SqlParameter> list = new List<SqlParameter>();
                list.Add(DBUtils.GetParameter("@user_name", kullaniciAdı));
                list.Add(DBUtils.GetParameter("@user_password", sifre));

                DataSet ds = DBUtils.SQLSelect(query, list);
                if (ds == null || ds.Tables[0].Rows.Count == 0)
                {
                    LogonSuccessful = false;
                    FrmMessage.showDialog("Kullanıcı adı ve şifre hatalı.", MessageTypes.Error);
                    return;
                }
                else if (ds.Tables[0].Rows.Count != 0)
                {
                    LogonSuccessful = true;
                    UserSession.getInstance().userName = kullaniciAdı;
                    UserSession.getInstance().userType = ds.Tables[0].Rows[0]["user_type"].ToString();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                FrmMessage.showDialog("Hata :" + ex.Message, MessageTypes.Error);
            }
        }

        private void btnVazgec_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals(Convert.ToChar(13)))
            {
                btnOnay_Click(sender, e);
            }
        }

        private void FrmLogin_Load(object sender, EventArgs e)
        {
            checkSQL();
            //checkRegistry();
        }

        private void checkSQL()
        {
            ////HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names
            ////Eğer bu bilgisayarda SQL SERVER veya SQLSERVEREXPRESS s ürümü yüklendi ise yukarıda regedit bölümünde yüklü SQL SERVER instance'leri yer alacaktır.          
            //var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
            //string[] yuklusqller = (string[])localMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Microsoft SQL Server").GetValue("InstalledInstances");
            
            ////Eğer kullanıcının bilgisayarında SQLExpress yüklü değilse
            
            //var yukluozellikler = yuklusqller != null ? (from s in yuklusqller where s.Contains("SQLEXPR") select s).FirstOrDefault() : null;


            //MessageBox.Show("1");
            string[] yuklusqller = null;
            var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
            var key = localMachine.OpenSubKey("Software");
            if (key != null)
                key = key.OpenSubKey("Microsoft");
            if (key != null)
                key = key.OpenSubKey("Microsoft SQL Server");
            if (key != null)
                yuklusqller = (string[])key.GetValue("InstalledInstances");
            //MessageBox.Show("3");
            //Eğer kullanıcının bilgisayarında SQLExpress yüklü değilse

            var yukluozellikler = yuklusqller != null ? (from s in yuklusqller where s.Contains("SQLEXPR") select s).FirstOrDefault() : null;
            //MessageBox.Show("4");

            if (yukluozellikler == null)
            {
                DialogResult sonuc = MessageBox.Show("Programı kullanabilmek için SQLEXPRESS gereklidir. Bu Programı Yüklemek istiyor musunuz?", "UYARI", MessageBoxButtons.YesNo);
                if (sonuc == DialogResult.Yes)
                {
                    string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\SQLEXPR_x64_ENU.EXE";
                    Process pro = new Process();
                    pro.StartInfo.FileName = path;
                    //Aşağıdaki parametreleri SQLEXPRESS setup dosyama göndererek kurulumu başlatırsam kullanıcıya kurulum yeri v.s gibi bilgileri sormayacak ve doğrudan kuruluma geçecektir.
                    //pro.StartInfo.Arguments = "/qb INSTANCENAME=\"SQLEXPRESS\" INSTALLSQLDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLSHAREDDIR=\"C:\\Program Files\\Microsoft SQL Server\" INSTALLSQLDATADIR=\"C:\\Program Files\\Microsoft SQL Server\" ADDLOCAL=\"All\" SQLAUTOSTART=1 SQLBROWSERAUTOSTART=0 SQLBROWSERACCOUNT=\"NT AUTHORITY\\SYSTEM\" SQLACCOUNT=\"NT AUTHORITY\\SYSTEM\" SECURITYMODE=SQL SAPWD=\"\" SQLCOLLATION=\"SQL_Latin1_General_Cp1_CS_AS\" DISABLENETWORKPROTOCOLS=0 ERRORREPORTING=1 ENABLERANU=0";
                    //pro.StartInfo.Arguments = "/ACTION=Install /INSTANCENAME=SQLEXPRESS /FEATURES=SQLENGINE /QS /IACCEPTSQLSERVERLICENSETERMS=true /SQLSVCSTARTUPTYPE=Automatic /SQLSVCACCOUNT=\"NT AUTHORITY\\SYSTEM\" /BROWSERSVCSTARTUPTYPE=Disabled /ADDCURRENTUSERASSQLADMIN=true /TCPENABLED=1 /HIDECONSOLE";
                    pro.StartInfo.Arguments = "/Q /INSTANCEID=\"SQLExpress\" /ACTION=\"Install\" /FEATURES=SQLENGINE /HELP=\"False\" /INDICATEPROGRESS=\"False\" /QUIET=\"False\" /QUIETSIMPLE=\"False\" /INSTANCEDIR=\"C:\\Program Files\\Microsoft SQL Server\" /INSTANCENAME=\"SQLEXPRESS\" /ISSVCACCOUNT=\"NT AUTHORITY\\NetworkService\" /ASSVCSTARTUPTYPE=\"Automatic\" /SQLSVCSTARTUPTYPE=\"Automatic\" /SQLCOLLATION=\"Turkish_CI_AS\" /SQLSVCACCOUNT=\"NT AUTHORITY\\SYSTEM\" /SQLSYSADMINACCOUNTS=\"Builtin\\Administrators\" /TCPENABLED=\"0\" /NPENABLED=\"0\" /ADDCURRENTUSERASSQLADMIN=\"False\"";

                    //Process için pencere oluştur
                    pro.StartInfo.CreateNoWindow = true;
                    //Process arka planda çalışsın.
                    pro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    pro.Start();
                    //İSQL kurulumu bitene kadar bekle
                    pro.WaitForExit();
                }
                else
                {
                    //SQLEXPRESS'i kurmak istemiyorsa programı sonlandır
                    this.Close();
                }
            }
        }

        private void checkRegistry()
        {
            var localMachine = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
            RegistryKey anahtar = localMachine.OpenSubKey("System").OpenSubKey("SystemSet1", true);//.OpenSubKey("Microsoft SQL Server").GetValue("InstalledInstances");
            //RegistryKey anahtar = Registry.CurrentUser;
            //anahtar = anahtar.CreateSubKey("Software\\Coder");

            if (anahtar == null || anahtar.GetValue("SYSFLAG") == null || anahtar.GetValue("CNT") == null)
            {
                MessageBox.Show("Program hatası ver");
                return;
            }
            else
            {
                DateTime kurulumTar = Convert.ToDateTime(anahtar.GetValue("SYSFLAG"));
                DateTime now = Convert.ToDateTime(DateTime.Now.AddDays(0));

                TimeSpan fark = now - kurulumTar;
                int sonuc = Convert.ToInt32(fark.Days);

                var value = (byte[])anahtar.GetValue("CNT");
                var valueAsInt = BitConverter.ToInt32(value, 0);


                if (sonuc < 0 || valueAsInt > sonuc)
                {
                    MessageBox.Show("tarih kurulum tarihinden geri alınmış");
                    this.Close();
                }

                if (valueAsInt + 1 < sonuc)
                {
                    MessageBox.Show("tarih ileri alınmış");
                    this.Close();
                }

                if (valueAsInt == sonuc || valueAsInt + 1 == sonuc)
                {
                    MessageBox.Show("herşey yolunda");
                    byte[] byteArray = BitConverter.GetBytes(sonuc);

                    anahtar.SetValue("CNT", byteArray, RegistryValueKind.Binary);
                    anahtar.Flush();
                }
            }
        }

    }
}
